home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_01 / 2n01044a < prev    next >
Text File  |  1990-06-24  |  3KB  |  119 lines

  1. (*
  2.         Minimal MicroSoft Mouse Driver Interface Unit
  3.  
  4.         **************************************************
  5.         NOTE:   All compilations should have the boolean
  6.                 evaluation option set to "short-circuit"
  7.         **************************************************
  8.  
  9.         June 26, 1990       Michael Kelly     Version 1.01    *)
  10.  
  11. Unit Mouse;
  12.  
  13. Interface
  14. Uses Dos;
  15.  
  16.     Const
  17.         MouseInterrupt : Byte = $33;
  18.  
  19.     Var
  20.         MouseOn,
  21.         MouseVisible    : Boolean;
  22.  
  23.  
  24.  
  25. Procedure MouseInit;    { initializes mouse driver if one is present }
  26.  
  27. Procedure ToggleMouseVisibility; { toggles mouse cursor visible/hidden }
  28.  
  29. Procedure MouseReset; { resets mouse driver, if active, to default state }
  30.  
  31. (*
  32.  *  stores mouse coordinates and button state info in
  33.  *  parameters if mouse driver active
  34.  *
  35.  *  returns:
  36.  *              True if mouse driver is active
  37.  *
  38.  *              False if mouse driver is not active
  39.  *)
  40. Function GetMousePosition(Var MouseX, MouseY, MouseButtons : Word) : Boolean;
  41.  
  42.  
  43. Implementation
  44.  
  45. Procedure MouseInit;
  46.     Var
  47.         Regs        : Registers;
  48.         Vector      : Pointer;
  49.     OpCode        : ^Byte;
  50.  
  51. Begin
  52.   GetIntVec(MouseInterrupt, Vector);
  53.  
  54.   If (Vector = Nil) then
  55.     Exit;
  56.   OpCode := Vector;     { mouse interrupt vector }
  57.   If OpCode^ = $CF then { interrupt return opcode indicates no mouse driver }
  58.     Exit;
  59.   Regs.ax := 0;
  60.   Intr(MouseInterrupt, Regs);
  61.   If Regs.ax = $FFFF then   { -1 indicates mouse driver active }
  62.   Begin
  63.     MouseOn := True;
  64.     MouseVisible := False;
  65.   End;
  66. End;
  67. (* MouseInit *)
  68.  
  69. Procedure ToggleMouseVisibility;
  70.     Var
  71.         Regs         : Registers;
  72.  
  73. Begin
  74.   If MouseOn then
  75.   Begin
  76.     If MouseVisible then
  77.       Regs.ax := $0002
  78.     Else
  79.       Regs.ax := $0001;
  80.     Intr(MouseInterrupt, Regs);
  81.     MouseVisible := not MouseVisible; { track mouse visible/hidden state }
  82.   End;
  83. End;
  84. (* ToggleMouseVisibility *)
  85.  
  86. Procedure MouseReset;
  87. Begin
  88.   If MouseVisible then
  89.     ToggleMouseVisibility;
  90.   MouseInit;
  91. End;
  92. (* MouseReset *)
  93.  
  94. Function GetMousePosition(Var MouseX, MouseY, MouseButtons : Word) : Boolean;
  95.     Var
  96.         Regs : Registers;
  97.  
  98. Begin
  99.   If not MouseOn then   { if mouse driver not active, return False }
  100.   Begin
  101.     GetMousePosition := False;
  102.     Exit;
  103.   End;
  104.   Regs.ax := $0003;
  105.   Intr(MouseInterrupt, Regs);
  106.   MouseButtons := Regs.bx;      { store mouse button state }
  107.   MouseX := Regs.cx;            { store mouse x coordinate }
  108.   MouseY := Regs.dx;            { store mouse y coordinate }
  109.   GetMousePosition := True;     { return True }
  110. End;
  111. (* GetMousePosition *)
  112.  
  113. { Initialization }
  114.  
  115. Begin
  116.   MouseOn  := False;
  117.   MouseVisible := False;
  118. End.
  119.